680 验证回文字符串 2 
给你一个字符串  s ,最多 可以从中删除一个字符。
请你判断  s  是否能成为回文字符串:如果能,返回  true  ;否则,返回  false  。
示例 1:
** 输入:**s = "aba" ** 输出:**true
示例 2:
** 输入:**s = "abca" ** 输出:**true ** 解释:** 你可以删除字符 'c' 。
示例 3:
** 输入:**s = "abc" ** 输出:**false
自己写的超时了暴力
ts
function validPalindrome(s: string): boolean {
    if (isH(s)) return true
    let arr = s.split('')
    for (let i = 0; i < s.length; i++) {
        let newArr = arr.slice(0, i).concat(arr.slice(i + 1))
        if (isH(newArr.join(''))) return true
    }
    return false
};
function isH(s: string) {
    return s == s.split('').reverse().join('')
}1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
正确解法贪心双指针
ts
var isPalindrome = function(s, i, j) {
    while (i < j) {
        if (s[i] !== s[j]) {
            return false;
        }
        i++;
        j--;
    }
    return true;
};
var validPalindrome = function(s) {
    let i = 0, j = s.length - 1;
    while (i < j) {
        if (s[i] !== s[j]) {
            // 删除 s[i] 或者 s[j]
            return isPalindrome(s, i + 1, j) || isPalindrome(s, i, j - 1);
        }
        i++;
        j--;
    }
    return true; // s 本身就是回文串
};1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23